package com.lovi.collection_.list_;

import java.util.ArrayList;

public class ArrayListSource {
    public static void main(String[] args) {

        //老韩解读源码
        //注意，注意，注意，Idea 默认情况下，Debug 显示的数据是简化后的，如果希望看到完整的数据
        //需要做设置.
        //使用无参构造器创建ArrayList对象
        ArrayList list = new ArrayList();
        /*
        01 :
        public ArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//final Object[] ;是{}的
        }
        Object[] elementData; 为{}
        size = 0
         */
//        ArrayList list = new ArrayList(8);
        //使用for给list集合添加 1-10数据
        /*
        添加第一个数据的时候 e为我们传进来要添加的元素
        这是我们的add方法
        public boolean add(E e) {
            //最开始我们的size是0，然后随着我们添加元素几个最终就会递增几个
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
        }
        02. 确定list的容量大小
        private void ensureCapacityInternal(int minCapacity) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
                //初始容量分配 10，这里是比大小 默认的是10，minCapacity参数最开始是2
                //如果初始的是用户自己分配的，那就是用用户的了
                minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
            }

            ensureExplicitCapacity(minCapacity);
        }
        03.确定list容量并判断是否要执行扩容
        private void ensureExplicitCapacity(int minCapacity) {
            modCount++;//自动递增，现在是第几个元素

            // overflow-conscious code
            //当前的元素长度不满足要求的最小长度，那就要执行扩容方法啦
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        }
        04.扩容方法本法
        private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            //新容量初始化是0，之后是 1.5倍扩容
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            //扩容后的和最低要求的比，谁大用谁
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            // minCapacity is usually close to size, so this is a win:
            //数组拷贝，可以直接保留原数据，在后边有null
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
         */
        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }
        //使用for给list集合添加 11-15数据
        for (int i = 11; i <= 15; i++) {
            list.add(i);
        }
        list.add(100);
        list.add(200);
        list.add(null);

    }
}

